package com.yolov8.util;


import lombok.extern.slf4j.Slf4j;
import org.bytedeco.opencv.opencv_core.*;
import com.yolov8.steam.FrameProcessor; // 引入检测结果类

import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

import static org.bytedeco.opencv.global.opencv_imgcodecs.imwrite;
import static org.bytedeco.opencv.global.opencv_imgproc.*;

@Slf4j
public class ImageUtils {

    /**
     * 在图像上绘制检测结果（边界框和标签）
     * @param mat 原图
     * @param detections 检测结果列表
     * @param classNames 类别名称列表
     */
    public static void drawDetections(Mat mat, List<FrameProcessor.Detection> detections, List<String> classNames) {
        log.info("绘制检测结果");
        log.info("⚠️ 检测结果数量：" + detections.size());
        if (detections == null || classNames == null || classNames.size() == 0) return;
        for (FrameProcessor.Detection detection : detections) {
            if (detection.classId < 0 || detection.classId >= classNames.size()) continue;

            int x1 = (int) detection.x1;
            int y1 = (int) detection.y1;
            int x2 = (int) detection.x2;
            int y2 = (int) detection.y2;


            log.info("绘制边框坐标"+"x1:"+x1+"y1:"+y1+"x2:"+x2+"y2:"+y2);
            // 绘制绿色边界框（BGR格式）
            rectangle(mat, new Rect(x1, y1, x2 - x1, y2 - y1),
                    new Scalar(0, 255, 0,0), 2, LINE_AA, 0);

            // 生成标签文本：类别名 + 置信度
            String label = String.format("%s: %.2f",
                    classNames.get(detection.classId), detection.confidence);

            // 计算文本尺寸和基线
            int[] baseline = new int[1];
            Size textSize = getTextSize(label, FONT_HERSHEY_SIMPLEX, 0.6, 1, baseline);

            // 绘制标签背景矩形
            rectangle(mat, new Rect(x1, y1 - textSize.height() - baseline[0],
                            x2 - x1, textSize.height() + baseline[0]),
                    new Scalar(0, 255, 0,0), FILLED, LINE_AA, 0);

            // 绘制标签文本（黑色字体）
            putText(mat, label, new Point(x1, y1 - baseline[0]),
                    FONT_HERSHEY_SIMPLEX, 0.6, new Scalar(0, 0, 0, 0), 1, LINE_AA,false);
        }
    }

    /**
     * 将Mat图像保存到文件
     * @param mat 待保存的图像
     * @param filePath 保存路径（含文件名，如 "output.jpg"）
     */
    public static void saveMatToFile(Mat mat, String filePath) {
        if (mat != null && !mat.empty()) {
            // 自动添加扩展名
            if (!filePath.endsWith(".jpg") && !filePath.endsWith(".png")) {
                filePath += ".jpg";
            }

            // 获取目录和文件名
            File originalFile = new File(filePath);
            String parentDir = originalFile.getParent();
            String baseName = originalFile.getName();

            // 生成时间戳
            String timestamp = new SimpleDateFormat("yyyyMMdd_HHmmss_SSS").format(new Date());

            // 拆分文件名
            int dotIndex = baseName.lastIndexOf(".");
            String namePart = (dotIndex != -1) ? baseName.substring(0, dotIndex) : baseName;
            String extPart = (dotIndex != -1) ? baseName.substring(dotIndex) : ".jpg";

            // 构造最终路径（比如：data/detection_20250603_120000.jpg）
            String finalName = namePart + "_" + timestamp + extPart;
            String finalPath = (parentDir != null ? parentDir + File.separator : "") + finalName;

            // 确保目录存在
            if (parentDir != null) {
                new File(parentDir).mkdirs();
            }

            // 保存图像
            boolean success = imwrite(finalPath, mat);
            if (success) {
                log.info("图像已保存：" + finalPath);
            } else {
                log.error("图像保存失败：" + finalPath);
            }
        }
    }


}